﻿using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using MakeIT.MiraPark.Negocios;
using MakeIT.MiraPark.Apresentacao.Rotinas;

namespace MiraPark
{
    public partial class FormCobrancaConvenio : Form
    {
        List<MovimentacaoVO> listMovimentacaoVOs = null;
        List<RelMovConvVO> listRelMovConvVO = null;

        public FormCobrancaConvenio()
        {
            InitializeComponent();
        }
        private void FormCobrancaConvenio_Load(object sender, EventArgs e)
        {
            this.dateTimePickerFim.Value = DateTime.Today;

            List<ConvenioVO> listConvenioVOs = ModelBO.getConvenios(true);
            List<IdValueVO> listIdValueVOs = new List<IdValueVO>();
            foreach (ConvenioVO convenioVO in listConvenioVOs)
                listIdValueVOs.Add(IdValueVO.CreateIdValueVO(convenioVO.idConvenio.ToString(), convenioVO.clienteVO.nome+" - Dia Pgto: "+convenioVO.diaPgto.ToString()));

            comboBoxConvenio.DataSource = listIdValueVOs;
        
        }

        private bool checkConflito(ArrayList conflito, int vagas, DateTime entrada)
        {
            if (vagas == 0)
                return false;

            int conflitos = -1; //-1 para desconsiderar a própria entrada
            foreach (DateTime[] datas in conflito)
            {
                if (entrada< datas[1]) conflitos++;
            }
            return conflitos > vagas;
        }

        private void buttonExecutar_Click(object sender, EventArgs e)
        {
            //this.dataGridViewRanking.Rows.Clear();

            ConvenioVO convenioVO = ModelBO.getConvenio(int.Parse(this.comboBoxConvenio.SelectedValue.ToString()));
            convenioVO.tabelaConvenioVO = ModelBO.getTabelaConvenio(convenioVO.idTabelaConvenio);
            ModelBO.getTabelaConvenioXPeriodos(convenioVO.tabelaConvenioVO);

            listRelMovConvVO = new List<RelMovConvVO>();
            listMovimentacaoVOs = 
                ModelBO.getMovimentacoes(null, null, convenioVO.idConvenio,
                                         new DateTime(1,1,1), this.dateTimePickerFim.Value,
                                         null, null, false, true, MovimentacaoVO.Especie.Convenio, true, false, false, true,true);

            decimal valorTotal = convenioVO.tabelaConvenioVO.valorMensal * (convenioVO.vagas > 0 ? convenioVO.vagas : 1);
            
            ArrayList conflito = new ArrayList();
            StringBuilder temp = new StringBuilder();
            foreach (MovimentacaoVO movimentacaoVO in listMovimentacaoVOs)
            {
                conflito.Add(new DateTime[2]{movimentacaoVO.entrada,movimentacaoVO.saida});

                temp.AppendLine(
                    "Entrada: "+movimentacaoVO.entrada.ToString() +
                    " Saida: "+movimentacaoVO.saida.ToString() +
                    " Placa: "+movimentacaoVO.placa +
                    " Ticket: "+movimentacaoVO.ticket +
                    " Valor cliente: "+movimentacaoVO.valor.ToString("#,##0.00")
                    );

                foreach (MovimentoVO movimentoVO in movimentacaoVO.movimentoVOs)
                {
                    valorTotal += movimentoVO.valorConvenio;

                    if (checkConflito(conflito,convenioVO.vagas,movimentacaoVO.entrada))
                    {
                        movimentoVO.periodo = movimentoVO.periodo +
                            "\n\tAcréscimo entrada simultânea: " + convenioVO.tabelaConvenioVO.tabelaConvenioPVOs[movimentoVO.idTabelaConvenioP - 1].valorConvenioAdicional.ToString("#,##0.00");
                        movimentoVO.valorConvenioExtra = convenioVO.tabelaConvenioVO.tabelaConvenioPVOs[movimentoVO.idTabelaConvenioP - 1].valorConvenioAdicional;
                        temp.AppendLine("\tAcréscimo entrada simultânea: "+movimentoVO.valorConvenioExtra.ToString("#,##0.00"));
                        valorTotal += movimentoVO.valorConvenioExtra;
                    }
                    temp.AppendLine( 
                        "\tValor Cliente: "+movimentoVO.valor.ToString("#,##0.00")+
                        " Valor Convênio: " + movimentoVO.valorConvenio.ToString("#,##0.00") +
                        " Valor Convênio Extra: " + movimentoVO.valorConvenioExtra.ToString("#,##0.00") +
                        " - " + movimentoVO.periodo
                        );

                    if (convenioVO.diaPgto > 0) { }
                    if (convenioVO.situacao.Length > 0) { }

                    RelMovConvVO rmvVO = RelMovConvVO.CreateRelMovConvVO();
                    rmvVO.entrada = movimentacaoVO.entrada;
                    rmvVO.saida = movimentacaoVO.saida;
                    rmvVO.placa = movimentacaoVO.placa;
                    rmvVO.ticket = movimentacaoVO.ticket;
                    rmvVO.valor = movimentoVO.valor;
                    rmvVO.valorConvenio = movimentoVO.valorConvenio;
                    rmvVO.valorConvenioExtra = movimentoVO.valorConvenioExtra;
                    rmvVO.periodo = movimentoVO.periodo;
                    listRelMovConvVO.Add(rmvVO);
                }
            }

            valorTotal = Math.Max(valorTotal, convenioVO.tabelaConvenioVO.valorMensalMinimo);
            temp.AppendLine("Valor total= "+valorTotal.ToString("#,##0.00"));

            this.textBox1.Text = temp.ToString();
            this.numericUpDownValor.Value = valorTotal;
            this.dateTimePickeVcto1.Value = new DateTime(DateTime.Now.Year, DateTime.Now.Month, convenioVO.diaPgto);
            this.textBoxReferente.Text = "Fechamento " + DateTime.Now.ToString("MM/yyyy");
            this.numericUpDownValor.Enabled = true;
            this.dateTimePickeVcto1.Enabled = true;
            this.textBoxReferente.Enabled = true;
            this.buttonImprimir.Enabled = true;

        }

        private void buttonLancar_Click(object sender, EventArgs e)
        {
            
            if (this.textBoxReferente.Text.Trim().Length == 0)
            {
                MessageBox.Show("Informe a referência.", "Aviso");
                return;
            }
            DialogResult dr = MessageBox.Show(this, "Certifique-se de ter impresso o relatório pois não estará mais disponível!\nConfirma a criação do lançamento ?", "Confirmação", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
            if (dr.ToString().Equals("Yes"))
            {

                foreach (MovimentacaoVO movimentacaoVO in listMovimentacaoVOs)
                {
                    movimentacaoVO.fechConvenio = true;
                    ModelBO.setMovimentacao(movimentacaoVO);
                }

                RecebimentoVO recebimentoVO = RecebimentoVO.CreateRecebimentoVO();
                recebimentoVO.dtVencimento = this.dateTimePickeVcto1.Value;
                recebimentoVO.idConvenio = int.Parse(this.comboBoxConvenio.SelectedValue.ToString());
                recebimentoVO.idMensalista = -1;
                recebimentoVO.idMovimentacao = -1;
                recebimentoVO.recebimento = this.textBoxReferente.Text;
                recebimentoVO.valor = this.numericUpDownValor.Value;

                ModelBO.newRecebimento(recebimentoVO);

                this.numericUpDownValor.Value = 0;
                this.dateTimePickeVcto1.Value = DateTime.Today;
                this.dateTimePickeVcto1.Enabled = false;
                this.textBoxReferente.Text = "";
                this.textBoxReferente.Enabled = false;
                this.numericUpDownValor.Enabled = false;
                this.buttonLancar.Enabled = false;
                this.buttonImprimir.Enabled = false;

                MessageBox.Show("Lançamento efetuado!", "Aviso");


            }
        }

        private void buttonImprimir_Click(object sender, EventArgs e)
        {
            if (this.textBoxReferente.Text.Trim().Length == 0)
            {
                MessageBox.Show("Informe a referência.", "Aviso");
                return;
            }

            ConvenioVO convenioVO = ModelBO.getConvenio(int.Parse(this.comboBoxConvenio.SelectedValue.ToString()));
            ClienteVO clienteVO = ModelBO.getCliente(convenioVO.idCliente);

            string convenio1 = "Conveniada: " + clienteVO.nome + (convenioVO.vagas == 0 ? "" : " - " + convenioVO.vagas + " Vagas ");
            string convenio2 = "Ref: " + this.textBoxReferente.Text;
            string vencimento = "Vencimento: " + this.dateTimePickeVcto1.Value.ToShortDateString();
            string valorTotal = "Valor: " + this.numericUpDownValor.Value;

            FormReportCobrancaConvenio formx = new FormReportCobrancaConvenio();
            formx.MdiParent = this.MdiParent;
            formx.setDataSource(listMovimentacaoVOs, listRelMovConvVO, convenio1, convenio2, vencimento, valorTotal);
            formx.Show();

            this.buttonLancar.Enabled = true;
        }

    }
}
